package org.me.servlet;

import java.io.Serializable;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.me.entityBeans.TPaises;
import org.me.service.PaisServiceJdbc;

//Usado por paginacion.xhtml que es la plantilla de reportes con paginacion explicita
//Bean que usa las plantillas JDBC de Spring (para hacer solo lecturas de la BD -> SELECT )
public class ConsultasPaisesController implements Serializable {
    private PaisServiceJdbc paisServiceJdbcImpl;    
        
    private List beanList;//mostrar paises al cliente por AJAX       
    private String nom_pais;
    private Integer numPaises;
    private Integer numeroPaginas;//cantidad de paginas
    private String visPanelNav;
      
    private String visible; 
    private Integer paginaActual;//Pagina en la que nos encontramos
    
    //Botones de Navegacion
    private Boolean activeFirst;
    private Boolean activePrevious;
    private Boolean activeNext;
    private Boolean activeLast;   
    
    //pagina a la que se quiere ir manualmente
    private Integer irAPagina;
    
    public ConsultasPaisesController() {   
        this.visPanelNav = "hidden"; //los botones de navegacion se encuentran en un div, que va estar invisible la 1ra vez  
        this.visible = "hidden";
    }
    
    public PaisServiceJdbc getPaisServiceJdbcImpl() {
        return paisServiceJdbcImpl;
    }

    public void setPaisServiceJdbcImpl(PaisServiceJdbc paisServiceJdbcImpl) {
        this.paisServiceJdbcImpl = paisServiceJdbcImpl;
    }

    public List getBeanList() {
        return beanList;
    }

    public void setBeanList(List beanList) {
        this.beanList = beanList;
    }

    
    public String getNom_pais() {
        return nom_pais;
    }

    public void setNom_pais(String nom_pais) {
        this.nom_pais = nom_pais;
    }

    public Integer getNumPaises() {
        return numPaises;
    }

    public void setNumPaises(Integer numPaises) {
        this.numPaises = numPaises;
    }

    public String getVisPanelNav() {
        return visPanelNav;
    }

    public void setVisPanelNav(String visPanelNav) {
        this.visPanelNav = visPanelNav;
    }

    public Integer getNumeroPaginas() {
        return numeroPaginas;
    }

    public void setNumeroPaginas(Integer numeroPaginas) {
        this.numeroPaginas = numeroPaginas;
    }  

    public Boolean getActiveNext() {
        return activeNext;
    }

    public void setActiveNext(Boolean activeNext) {
        this.activeNext = activeNext;
    }  

    public String getVisible() {
        return visible;
    }

    public void setVisible(String visible) {
        this.visible = visible;
    }

    public Boolean getActiveFirst() {
        return activeFirst;
    }

    public void setActiveFirst(Boolean activeFirst) {
        this.activeFirst = activeFirst;
    }

    public Boolean getActiveLast() {
        return activeLast;
    }

    public void setActiveLast(Boolean activeLast) {
        this.activeLast = activeLast;
    }

    public Boolean getActivePrevious() {
        return activePrevious;
    }

    public void setActivePrevious(Boolean activePrevious) {
        this.activePrevious = activePrevious;
    }

    public Integer getPaginaActual() {
        return paginaActual;
    }

    public void setPaginaActual(Integer paginaActual) {
        this.paginaActual = paginaActual;
    }

    public Integer getIrAPagina() {
        return irAPagina;
    }

    public void setIrAPagina(Integer irAPagina) {
        this.irAPagina = irAPagina;
    }
    
    //Busca de 10 en 10 (Comienza con los 10 primeros) cuando presiona Buscar.
    public void execute(ActionEvent event)
    {        
        String pais = this.getNom_pais().trim().toUpperCase();
         
        List<TPaises> paises = this.getPaisServiceJdbcImpl().findPaises( 1, 10, pais, "BOTON_EJECUTAR" ); //graba query en la func. findPaises()             
        
        if( paises != null )
        {       
            if( paises.size() > 0 )
            {
                this.setBeanList( paises ); //traemos los paises para ser seteado en beanList 

                this.numPaises = this.getPaisServiceJdbcImpl().getNumPaisesActualizados(); //Total num de paises encontrados segun criterio/os                       

                this.paginacion("execute");// paginacion en la vista  segun numPaises      
                this.paginaActual = 1;              
            }
            else //se pone estas lineas, ya que aveces retorna un ArrayList, así no haya coincidencias ( con size = 0 )
            {
                this.setBeanList(null); 
                this.setVisPanelNav("hidden");
            }     
        }
        else
        {
            this.setBeanList(null); 
            this.setVisPanelNav("hidden");
        }            
    }   
        
    //Segun la pagina enviada desde los botones links de navegacion(Automatico), se van a mostrar los paises
    public void executebyPage(ActionEvent event)
    {           
        String sPage = (String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("page");//a4j:commandLink(href)
        
        Integer iPage = Integer.parseInt(sPage);
        this.obtenerDatosActualizados();
        this.funcionExecuteByPage(iPage);       
    }
    
    //Busqueda que se realiza cuando se ingresa desde la caja de texto el nro de pagina deseada(Manual)
    public void executebyPage2(ActionEvent event)
    {            
        //Como la pagina es enviada manualmente, nos aseguramos que este entre el rango de 1 hasta numeroPaginas
        Integer iPage;
        iPage = this.getIrAPagina();
        
        this.obtenerDatosActualizados();
        
        if(iPage <= 0 )
            iPage = 1;
        else if(iPage > this.numeroPaginas )
            iPage = this.numeroPaginas;
        
        this.funcionExecuteByPage(iPage); //tambien actuliza los botones de navegacion     
    }
    
    private void funcionExecuteByPage(Integer iPage)
    {              
        Integer umbInferior = (10 * ( iPage - 1) + 1);
        Integer umbSuperior = umbInferior + 9;
        
        List<TPaises> paises = this.getPaisServiceJdbcImpl().findPaises(umbInferior, umbSuperior, null, "LINKS_PAGINACION");   //usa la query guardada(session)        
        this.setBeanList(paises); //traemos los paises para ser seteado en beanList 
        
        this.setPaginaActual(iPage);
        
        this.actualizarBotones(iPage);
        //this.actualizarNumeros();   Implementar??    
    }
    
    private void obtenerDatosActualizados()
    {
        //Datos actualizados
        this.numPaises = this.getPaisServiceJdbcImpl().getNumPaisesActualizados();
        this.paginacion("executebyPage");//actualizamos, en caso hayan ingresado o borrado algun registro de la BD.
    }
    
    
    private void paginacion(String opcion)
    {       
        if ( this.numPaises % 10 == 0 )
            this.numeroPaginas = this.numPaises / 10; //parte entera
        else
            this.numeroPaginas = ( this.numPaises / 10 ) + 1;
        
        if( this.numeroPaginas == 1 )
        {
            this.visPanelNav = "hidden";
        }
        else
        {
            this.visPanelNav = "visible"; 
            //Solo entra cuando es llamado de la func. execute(es decir la "1ra" vez)
            if (opcion.equals("execute"))
                this.estadoBotones(true, true, false, false);
        }        
    }   
    
    private void estadoBotones(boolean first, boolean previous, boolean next, boolean last)
    {
        //deshabilitado (disabled = true)
        //botones de navegacion
        this.activeFirst = first; 
        this.activePrevious = previous;
        this.activeNext = next;
        this.activeLast = last;        
    }
    
    private void actualizarBotones(Integer iPage)
    {
        if(iPage == this.numeroPaginas)//si se presiono boton last o next que lleve a la ultima pagina
            this.estadoBotones(false, false, true, true);
        else 
            if(iPage == 1)//si se presiono boton first o previous que lleve a la primera pagina
                this.estadoBotones(true, true, false, false);
            else //todos los botones se habilitan
                this.estadoBotones(false, false, false, false);       
    }  
    
    public void clean(ActionEvent event){ 
        this.limpiarBean();        
    }
    
    private void limpiarBean(){
        this.setBeanList(null);    
        this.setNom_pais(null);
        this.setVisPanelNav("hidden");
    }      
    

}
